package br.com.fogas.medicao.activity.helper;

import java.util.ArrayList;
import java.util.List;

import br.com.fogas.database.FogasDatabase;
import br.com.fogas.database.entidade.Medidor;
import br.com.fogas.database.entidade.PlanoVisitas;
import br.com.fogas.medicao.R;
import br.com.fogas.utils.dialog.DialogAlert;
import br.com.fogas.utils.dialog.ProgressDialogBuilder;
import br.com.fogas.utils.task.ServiceTask;
import br.com.fogas.medicao.activity.validation.LeituraMedidorValidacao;
import br.com.fogas.medicao.business.NotaFiscalSimulacaoBusiness;
import br.com.fogas.medicao.utils.MedicaoUtils;
import br.com.fogas.notafiscal.enums.MedidorStatusEnum;
import br.com.fogas.utils.FogasUtility;
import br.com.fogas.utils.StringUtility;
import butterknife.ButterKnife;
import butterknife.InjectView;
import butterknife.OnClick;
import butterknife.OnItemSelected;
import android.support.v4.app.Fragment;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.Spinner;
import android.widget.TextView;

public class LeituraMedidorHelper {
	
	private Fragment fragment;
	private FogasDatabase database;
	private Medidor medidor;
	private PlanoVisitas planoCliente;
	private boolean qrCodeLido;
	
	@InjectView(R.id.tvLocal) TextView tvLocal; 
	@InjectView(R.id.tvCliente) TextView tvCliente; 
	@InjectView(R.id.tvMedidorInfo) TextView tvMedidorInfo;
	@InjectView(R.id.spinMedidor) Spinner spinMedidor;
	@InjectView(R.id.etContMedidor) EditText etContMedidor;
	@InjectView(R.id.btnSimular) Button btnSimular;
	@InjectView(R.id.divMedidor) LinearLayout divMedidor;
	@InjectView(R.id.divLeitura) LinearLayout divLeitura;
	
	public LeituraMedidorHelper(Fragment fragmentParent, PlanoVisitas planoCliente, 
			boolean qrCodeLido, Medidor medidor) {
		ButterKnife.inject(this, fragmentParent.getView());
		this.fragment = fragmentParent; 
		this.database = new FogasDatabase(fragment.getActivity());
		this.medidor = medidor;
		this.planoCliente = planoCliente;
		this.qrCodeLido = qrCodeLido;
		
		this.tvMedidorInfo.setVisibility(View.GONE);
		this.divMedidor.setVisibility(View.GONE);
		this.divLeitura.setVisibility(View.GONE);
		
		this.tvLocal.setText("Local: "+MedicaoUtils.nomeCliente(planoCliente.getLocal()));
		this.tvCliente.setText("Cliente: "+MedicaoUtils.nomeCliente(planoCliente.getCliente()));
		
		if(medidor != null) {
			this.tvMedidorInfo.setText("Medidor: "+medidor.getTx_cod_medidor());
			this.tvMedidorInfo.setVisibility(View.VISIBLE);
			this.divLeitura.setVisibility(View.VISIBLE);
			
			int maxLength = StringUtility.trim(medidor.getNb_max_cont()).length();
			FogasUtility.android.maxLengthEditText(etContMedidor, maxLength);
			this.etContMedidor.setHint("Informe a leitura com "+maxLength+" digitos!");
		} else {
			this.setupComboMedidor();
		}
	}
	
	public void onDestroy() {
		ButterKnife.reset(this);
		database.fecharConexao();
	}
	
	@OnClick(R.id.btnSimular)
	public void simularNota() {
		if(LeituraMedidorValidacao.validar(LeituraMedidorHelper.this)) {
			medidor.setNb_leitura_atual(etContMedidor.getText().toString());
			
			NotaFiscalSimulacaoBusiness business = new NotaFiscalSimulacaoBusiness(this);
			
			ProgressDialogBuilder builder = new ProgressDialogBuilder(fragment.getActivity())
			.setTitle(fragment.getString(R.string.label_simulacao_dlg_title))
			.setMessage(fragment.getString(R.string.label_simulacao_dlg_message));
			
			ServiceTask task = new ServiceTask(builder, business);
			task.execute();
		}
	}
	
	private static final String COMBO_SELECIONE = "Selecione...";
	
	private void setupComboMedidor() {
		List<String> listaAC = new ArrayList<String>();
		if(planoCliente.getMedidores().size() == 1) {
			Medidor medidorCombo = null;
			for(Medidor medidor: planoCliente.getMedidores()) {
				boolean medidorTrocado = StringUtility.equals(medidor.getTx_status(), 
						String.valueOf(MedidorStatusEnum.TROCA.getId()) );
				
				if(!medidorTrocado) {
					medidorCombo = medidor;
				}
			}
			listaAC.add(medidorCombo.getTx_cod_medidor());
		} else {
			listaAC.add(COMBO_SELECIONE);
			for (Medidor medidor : planoCliente.getMedidores()) {
				boolean medidorTrocado = StringUtility.equals(medidor.getTx_status(), 
						String.valueOf(MedidorStatusEnum.TROCA.getId()) );
				
				if(!medidorTrocado) {
					listaAC.add(medidor.getTx_cod_medidor());
				}
			}
		}

		ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(fragment.getActivity(), 
				android.R.layout.simple_spinner_item, listaAC);
		dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
		this.spinMedidor.setAdapter(dataAdapter);
		this.divMedidor.setVisibility(View.VISIBLE);
	}
	
	@OnItemSelected(R.id.spinMedidor)
	public void eventMedidorSelecionado(int position) {
		String comboItem = (String) spinMedidor.getAdapter().getItem(position);
		
		if(!itemSelecione(comboItem)) {
			
			for (Medidor medidorTemp : planoCliente.getMedidores()) {
				boolean medidorEncontrado = StringUtility.equals(medidorTemp.getTx_cod_medidor(), comboItem);
				
				if(medidorEncontrado) {
					medidor = medidorTemp;
					break;
				}
			}
			
			int maxLength = StringUtility.trim(medidor.getNb_max_cont()).length();
			FogasUtility.android.maxLengthEditText(etContMedidor, maxLength);
			etContMedidor.setHint("Informe a leitura com "+maxLength+" digitos!");
			divLeitura.setVisibility(View.VISIBLE);
		}
	}
	
	private boolean itemSelecione(String item) {
		if(item.equals(COMBO_SELECIONE)) {
			DialogAlert.newInstance()
			.setTitle(R.string.dialog_title_alert)
			.setCharMessage(fragment.getString(R.string.leitura_medidor_val_sel_medidor))
			.showDialog(fragment.getChildFragmentManager());
			
			medidor = null;
			etContMedidor.setText(StringUtility.EMPTY);
			divLeitura.setVisibility(View.GONE);
			
			return true;
		}
		return false;
	}

	public FogasDatabase getDatabase() {
		return database;
	}
	
	public Fragment getFragment() {
		return fragment;
	}

	public TextView getTvShopping() {
		return tvLocal;
	}

	public TextView getTvCliente() {
		return tvCliente;
	}

	public EditText getEtContMedidor() {
		return etContMedidor;
	}

	public Button getBtnSimular() {
		return btnSimular;
	}

	public TextView getTvMedidorInfo() {
		return tvMedidorInfo;
	}

	public Spinner getSpinMedidor() {
		return spinMedidor;
	}

	public LinearLayout getContentMedidor() {
		return divMedidor;
	}
	
	public PlanoVisitas getPlanoCliente() {
		return planoCliente;
	}
	
	public boolean isQrCodeLido() {
		return qrCodeLido;
	}
	
	public Medidor getMedidor() {
		return medidor;
	}
}